export class PhoneUtils {
  /**
   * 手机号校验工具类
   * 提供多种手机号格式的验证功能
   */


  /**
   * 手机号正则表达式模式
   */
  private static readonly PHONE_PATTERNS = {
    // 中国大陆手机号：1开头，第二位3-9，共11位
    CHINA_MAINLAND: /^1[3-9]\d{9}$/,

    // 香港手机号：5、6、9开头，共8位
    HONG_KONG: /^[569]\d{7}$/,

    // 澳门手机号：6开头，共8位
    MACAU: /^6\d{7}$/,

    // 台湾手机号：09开头，共10位
    TAIWAN: /^09\d{8}$/,

    // 国际格式（简单验证）：+号开头，1-15位数字
    INTERNATIONAL: /^\+\d{1,15}$/
  };

  /**
   * 校验手机号是否合法
   * @param phone 手机号码字符串
   * @param region 地区代码，默认为中国大陆
   * @returns 校验结果
   */
  static validate(phone: string, region: PhoneRegion = PhoneRegion.CHINA_MAINLAND): ValidationResult {
    if (!phone || phone.trim().length === 0) {
      return {
        isValid: false,
        message: '手机号不能为空'
      };
    }

    // 去除所有空格和特殊字符，只保留数字和+
    const cleanedPhone = phone.replace(/[^\d+]/g, '');

    if (cleanedPhone.length === 0) {
      return {
        isValid: false,
        message: '手机号格式不正确'
      };
    }

    let isValid = false;
    let message = '';

    switch (region) {
      case PhoneRegion.CHINA_MAINLAND:
        isValid = this.PHONE_PATTERNS.CHINA_MAINLAND.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的中国大陆手机号（11位，1开头）';
        break;

      case PhoneRegion.HONG_KONG:
        isValid = this.PHONE_PATTERNS.HONG_KONG.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的香港手机号（8位，5/6/9开头）';
        break;

      case PhoneRegion.MACAU:
        isValid = this.PHONE_PATTERNS.MACAU.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的澳门手机号（8位，6开头）';
        break;

      case PhoneRegion.TAIWAN:
        isValid = this.PHONE_PATTERNS.TAIWAN.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的台湾手机号（10位，09开头）';
        break;

      case PhoneRegion.INTERNATIONAL:
        isValid = this.PHONE_PATTERNS.INTERNATIONAL.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的国际手机号（+号开头）';
        break;

      case PhoneRegion.AUTO_DETECT:
        return this.autoDetectAndValidate(cleanedPhone);

      default:
        isValid = this.PHONE_PATTERNS.CHINA_MAINLAND.test(cleanedPhone);
        message = isValid ? '手机号格式正确' : '请输入正确的手机号';
    }

    return { isValid, message };
  }

  /**
   * 自动检测手机号地区并验证
   * @param phone 清理后的手机号
   * @returns 验证结果
   */
  private static autoDetectAndValidate(phone: string): ValidationResult {
    if (phone.startsWith('+')) {
      if (this.PHONE_PATTERNS.INTERNATIONAL.test(phone)) {
        return {
          isValid: true,
          message: '国际手机号格式正确',
          detectedRegion: PhoneRegion.INTERNATIONAL
        };
      }
    } else if (phone.startsWith('09') && phone.length === 10) {
      if (this.PHONE_PATTERNS.TAIWAN.test(phone)) {
        return {
          isValid: true,
          message: '台湾手机号格式正确',
          detectedRegion: PhoneRegion.TAIWAN
        };
      }
    } else if (phone.length === 8) {
      if (this.PHONE_PATTERNS.HONG_KONG.test(phone)) {
        return {
          isValid: true,
          message: '香港手机号格式正确',
          detectedRegion: PhoneRegion.HONG_KONG
        };
      } else if (this.PHONE_PATTERNS.MACAU.test(phone)) {
        return {
          isValid: true,
          message: '澳门手机号格式正确',
          detectedRegion: PhoneRegion.MACAU
        };
      }
    } else if (phone.length === 11 && phone.startsWith('1')) {
      if (this.PHONE_PATTERNS.CHINA_MAINLAND.test(phone)) {
        return {
          isValid: true,
          message: '中国大陆手机号格式正确',
          detectedRegion: PhoneRegion.CHINA_MAINLAND
        };
      }
    }

    return {
      isValid: false,
      message: '无法识别手机号格式，请检查输入'
    };
  }

  /**
   * 获取虚拟手机号（用于测试）
   * @param region 地区
   * @returns 虚拟手机号
   */
  static getSamplePhone(region: PhoneRegion): string {
    switch (region) {
      case PhoneRegion.CHINA_MAINLAND:
        return '13800138000';
      case PhoneRegion.HONG_KONG:
        return '51234567';
      case PhoneRegion.MACAU:
        return '61234567';
      case PhoneRegion.TAIWAN:
        return '0912345678';
      case PhoneRegion.INTERNATIONAL:
        return '+8613800138000';
      default:
        return '13800138000';
    }
  }

  /**
   * 格式化手机号显示
   * @param phone 手机号
   * @param format 格式类型
   * @returns 格式化后的手机号
   */
  static formatPhone(phone: string, format: PhoneFormat = PhoneFormat.DEFAULT): string {
    const cleaned = phone.replace(/[^\d+]/g, '');

    if (cleaned.startsWith('+')) {
      return cleaned; // 国际格式不处理
    }

    switch (format) {
      case PhoneFormat.SPACED:
        if (cleaned.length === 11) {
          return cleaned.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3');
        } else if (cleaned.length === 8) {
          return cleaned.replace(/(\d{4})(\d{4})/, '$1 $2');
        } else if (cleaned.length === 10) {
          return cleaned.replace(/(\d{2})(\d{4})(\d{4})/, '$1 $2 $3');
        }
        return cleaned;

      case PhoneFormat.DASHED:
        if (cleaned.length === 11) {
          return cleaned.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
        } else if (cleaned.length === 8) {
          return cleaned.replace(/(\d{4})(\d{4})/, '$1-$2');
        } else if (cleaned.length === 10) {
          return cleaned.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3');
        }
        return cleaned;

      default:
        return cleaned;
    }
  }
}

/**
 * 手机号地区枚举
 */
export enum PhoneRegion {
  CHINA_MAINLAND = 'china_mainland',    // 中国大陆
  HONG_KONG = 'hong_kong',              // 香港
  MACAU = 'macau',                      // 澳门
  TAIWAN = 'taiwan',                    // 台湾
  INTERNATIONAL = 'international',      // 国际格式
  AUTO_DETECT = 'auto_detect'           // 自动检测
}

/**
 * 手机号格式化选项
 */
export enum PhoneFormat {
  DEFAULT = 'default',      // 原始格式
  SPACED = 'spaced',        // 空格分隔
  DASHED = 'dashed'         // 短横线分隔
}

/**
 * 验证结果接口
 */
export interface ValidationResult {
  isValid: boolean;         // 是否有效
  message: string;          // 验证消息
  detectedRegion?: PhoneRegion; // 检测到的地区（仅自动检测时返回）

}